#include <stdlib.h>
#include <stdio.h>
#include "pion.h"
#include "plateau.h"
#include "stockcartetransaction.h"
#include "listecartecourrier.h"
#include "listecartetransaction.h"


/**
@brief Cette fonction définit le module Pion
@author MARLIER Molly & GUESDON Marine
@version 1.0
@date 2013/03/26
*/

/**
@brief InitialiserPion permet d'initialiser le pion càd de choisir sa couleur, d'initialiser son porte-monnaie et de la placer sur la case départ.
@param [in] p: pointeur sur Pion , [in,out] couleurchoisi: unsigned char, [in,out] cadeaudepart: int
@return none
*/
void InitialiserPion(Pion *p, const unsigned int couleurchoisie, const int cadeaudepart)
{

    p->couleur=couleurchoisie;
    InitialiserPorte_Monnaie(&(p->monnaie),cadeaudepart);
    p->position = 0;
    InitialiserTabDynT(&(p->stockT));
    p->nb_tours_effectue =0;
}

/**
@brief DeplacerPion permet de déplacer le pion du nombre de case donnée par le dé et s'arrête si on est sur la case jour de paye.
@param [in] p: pointeur sur Pion , [in] numerode: unsigned char, [in] pp: pointeur sur Plateau
@return none
*/

void DeplacerPion(Pion *p, unsigned int numero_de, Plateau* pp) {
while ((numero_de > 0) && (p->position != 31)) { /* Lorsque le pion se trouve sur la dernière case du plateau, il s'immobilise */
    p->position = p->position + 1 ;
    numero_de = numero_de - 1 ;  }
}


/**
@brief RetournerCaseDepart perme de retourneer à la case départ lorsqu'on est arrivée à la fin du mois
@param [in] p: pointeur sur Pion, [in] pp: pointeur sur Plateau
@return none
*/
void RetournerCaseDepart(Pion *p, Plateau *pp)
{
    p->position = 0 ;
    p->nb_tours_effectue= p->nb_tours_effectue + 1;
}


/**
@brief PiocherCarte permet de piocher la première carte du paquet transaction
@param [in] l: pointeur sur liste, [in] p: Pion, [in, out] nombrecartesapiocher: int
@return Carte
*/
void PiocherCarteTransaction (ListeTransaction *l, Pion *p, const int nombrecartesapiocher)
{
   CarteTransaction c;
   int i;
   i=nombrecartesapiocher;
   while (i>=0)
   {
       c= RecupererPremiereCarteT (l);
       AjouterElementTabDynT(&(p->stockT) , c);
       i--;
   }
}


/**
@brief RemettreCartes permet de remettre toutes les cartes transaction accumulés par le joueur pendant le mois
@param [in] l: pointeur sur liste
@return Carte
*/
void RemettreCartesTransactions (ListeTransaction *l, Pion *p)
{
    CarteTransaction temp;
    while (EstVideTabT(&(p->stockT))==0)
    {
        temp = ValeurIemeElementTabDynT(&(p->stockT), 0);
        SupprimerElementTabDynT( &(p->stockT), 0 );
        AjouterEnQueueListeT(temp,l);
    }
}

